#load("E16_Dec7v3_Trachea.RData")
basal, secretory, and ciliated:
table(E16_Dec7v3_epi@meta.data$res.1.2)

   1   13   17   19   20    4    6    7    9 
1849  566  333  263  235 1362 1072  887  749 
colnames(E16_Dec7v3_epi@meta.data)[colnames(E16_Dec7v3_epi@meta.data) == 'res.0.8'] <- 'orig.0.8'
colnames(E16_Dec7v3_epi@meta.data)[colnames(E16_Dec7v3_epi@meta.data) == 'res.1.2'] <- 'orig.1.2'
E16_Dec7v3_epi <- ScaleData(object = E16_Dec7v3_epi)
Scaling data matrix

  |                                                                                                                                                               
  |                                                                                                                                                         |   0%
  |                                                                                                                                                               
  |=======                                                                                                                                                  |   5%
  |                                                                                                                                                               
  |==============                                                                                                                                           |   9%
  |                                                                                                                                                               
  |=====================                                                                                                                                    |  14%
  |                                                                                                                                                               
  |============================                                                                                                                             |  18%
  |                                                                                                                                                               
  |===================================                                                                                                                      |  23%
  |                                                                                                                                                               
  |==========================================                                                                                                               |  27%
  |                                                                                                                                                               
  |=================================================                                                                                                        |  32%
  |                                                                                                                                                               
  |========================================================                                                                                                 |  36%
  |                                                                                                                                                               
  |===============================================================                                                                                          |  41%
  |                                                                                                                                                               
  |======================================================================                                                                                   |  45%
  |                                                                                                                                                               
  |============================================================================                                                                             |  50%
  |                                                                                                                                                               
  |===================================================================================                                                                      |  55%
  |                                                                                                                                                               
  |==========================================================================================                                                               |  59%
  |                                                                                                                                                               
  |=================================================================================================                                                        |  64%
  |                                                                                                                                                               
  |========================================================================================================                                                 |  68%
  |                                                                                                                                                               
  |===============================================================================================================                                          |  73%
  |                                                                                                                                                               
  |======================================================================================================================                                   |  77%
  |                                                                                                                                                               
  |=============================================================================================================================                            |  82%
  |                                                                                                                                                               
  |====================================================================================================================================                     |  86%
  |                                                                                                                                                               
  |===========================================================================================================================================              |  91%
  |                                                                                                                                                               
  |==================================================================================================================================================       |  95%
  |                                                                                                                                                               
  |=========================================================================================================================================================| 100%
E16_Dec7v3_epi <- FindVariableGenes(object = E16_Dec7v3_epi, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

run PCA on the set of genes
E16_Dec7v3_epi <- RunPCA(object = E16_Dec7v3_epi, do.print = FALSE)
#PCAPlot(E16_Dec7v3_epi)
E16_Dec7v3_epi <- ProjectPCA(object = E16_Dec7v3_epi, do.print = F)

n.pcs.sub = 17
res.used <- 1.2
E16_Dec7v3_epi <- FindClusters(object = E16_Dec7v3_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi <- RunTSNE(object = E16_Dec7v3_epi, dims.use = 1:n.pcs.sub, perplexity=30)

get tSNE embedding for velocyto:
E16_Dec_cv3_ID<-read.csv(file="E16_Dec_cv3_ID.csv",header=F,sep=",",stringsAsFactors = F) 
head(E16_Dec_cv3_ID)
E16_Dec_cv3_name<-gsub("x","",E16_Dec_cv3_ID)
head(E16_Dec_cv3_name)
E16_Dec_cv3_name<-gsub(":","_",E16_Dec_cv3_name)
head(E16_Dec_cv3_name)
TSNE1_Loomorder_epi<-E16_Dec7v3_epi@dr$tsne@cell.embeddings[match(E16_Dec_cv3_name,rownames(E16_Dec7v3_epi@dr$tsne@cell.embeddings)),1]
write(TSNE1_Loomorder_epi,"TSNE1_Loomorder_epi.csv",ncolumns=1,sep=",")
head(TSNE1_Loomorder_epi)
TSNE2_Loomorder_epi<-E16_Dec7v3_epi@dr$tsne@cell.embeddings[match(E16_Dec_cv3_name,rownames(E16_Dec7v3_epi@dr$tsne@cell.embeddings)),2]
write(TSNE2_Loomorder_epi,"TSNE2_Loomorder_epi.csv",ncolumns=1,sep=",")
markers for each ciliated population:
E16_Dec_epi_res12_8over1011<-FindMarkers(E16_Dec7v3_epi,ident.1=c(8),ident.2 = c(10,11),only.pos = TRUE)
E16_Dec_epi_res12_8over1011
write.table(E16_Dec_epi_res12_8over1011,"epiSubset_c8inCilia.txt",sep="\t")
E16_Dec_epi_res12_10over811<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(8,11),only.pos = TRUE)
E16_Dec_epi_res12_10over811
E16_Dec_epi_res12_10over8<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(8),only.pos = TRUE)
E16_Dec_epi_res12_10over8
write.table(E16_Dec_epi_res12_10over8,"epiSubset_c10overC8.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")

E16_Dec_epi_res12_10over11<-FindMarkers(E16_Dec7v3_epi,ident.1=c(10),ident.2 = c(11),only.pos = TRUE)
E16_Dec_epi_res12_10over11
write.table(E16_Dec_epi_res12_10over11,"epiSubset_c10overC11.txt",sep="\t")
E16_Dec_epi_res12_11over810<-FindMarkers(E16_Dec7v3_epi,ident.1=c(11),ident.2 = c(8,10),only.pos = TRUE)
E16_Dec_epi_res12_11over810
write.table(E16_Dec_epi_res12_11over810,"epiSubset_c11inCilia.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")
DoHeatmap(object = E16_Dec7v3_epi, genes.use = c("Foxj1","Top2a","Mcidas","Ccno","Foxn4","Shisa8","Lrrc23","Prr18","Cfap53","Cdhr3","Sntn","Ifitm1","Lbp","Ly6c1","Ly6a"), 
    slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = F,cells.use = E16_Dec7v3_epi@cell.names[E16_Dec7v3_epi@meta.data$res.1.2 %in% c(8,10,11)],group.order = c(8,10,11),group.cex = 30,cex.row = 20
  )

scoring:
E16_Dec7v3_epi@data[1:6,1:6]
percentile_table_epi<-apply(E16_Dec7v3_epi@data,1,percent_rank)
percentile_table_epi[1:6,1:6]
OMIMgene<-read.csv(file = "genesOMIM.csv",header=T,sep=",",stringsAsFactors = F)
OMIMgene<-lapply(OMIMgene,function(x) unlist(strsplit(unlist(x),split=","))) 
head(OMIMgene$Mucociliary)
OMIMgene_mucosaGoblet<-as.vector(read.csv(file = "genesOMIM_mucosa_goblet.csv",header=T,sep=",",stringsAsFactors = F)[,1])
OMIMgene_mucosaGoblet<-unlist(strsplit(unlist(OMIMgene_mucosaGoblet),split=","))
OMIMgene_mucosaGoblet[90:105]
 mocosaGoblet_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene_mucosaGoblet],1,mean)
 head( mocosaGoblet_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = mocosaGoblet_score, col.name = "mocosaGoblet_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("mocosaGoblet_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
 ciliopathy_table<- percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene$Ciliopathy]
 ciliopathy_score<- apply(ciliopathy_table,1,mean)
 head(ciliopathy_score)
 PCD_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% OMIMgene$Primary.ciliary.dyskinesia],1,mean)
 head(PCD_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = ciliopathy_score, col.name = "ciliopathy_score")
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = PCD_score, col.name = "PCD_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("ciliopathy_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), nCol = 1,ident.include = c(8,10,11),x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.2")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")

VlnPlot(object = E16_Dec7v3_epi, features.plot = c("ciliopathy_score"), ident.include = c(11),nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="seq_group")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.2")

VlnPlot(object = E16_Dec7v3_epi, features.plot = c("PCD_score"), ident.include = c(8),nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="seq_group")
 mucus_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$Airway...Mucus,OMIMgene$Pulmonary.and.Mucus)],1,mean)
 head(mucus_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = mucus_score, col.name = "mucus_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("mucus_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
 COPD_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$COPD)],1,mean)
 head(COPD_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = COPD_score, col.name = "COPD_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("COPD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
 asthma_score<- apply(percentile_table_epi[,colnames(percentile_table_epi) %in% c(OMIMgene$Pulmonary...Asthma)],1,mean)
 head(asthma_score)
E16_Dec7v3_epi<-AddMetaData(object = E16_Dec7v3_epi, metadata = asthma_score, col.name = "asthma_score")
VlnPlot(object = E16_Dec7v3_epi, features.plot = c("asthma_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")
ggplot(E16_Dec7v3_epi@meta.data,aes(genotype,asthma_score))+facet_grid(.~res.1.2)+geom_dotplot(binaxis="y",aes(color=genotype,fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1))
res.used <- 1.4
E16_Dec7v3_epi <- FindClusters(object = E16_Dec7v3_epi, reduction.type = "pca", dims.use = 1:n.pcs.sub, 
                     resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi <- RunTSNE(object = E16_Dec7v3_epi, dims.use = 1:n.pcs.sub, perplexity=30)

E16_Dec7v3_epi=buildClusterTree(E16_Dec7v3_epi,do.reorder = F,reorder.numeric = F,pcs.use = 1:17)
table(E16_Dec7v3_epi@meta.data$res.1.4,E16_Dec7v3_epi@meta.data$seq_group)
prop.table(table(E16_Dec7v3_epi@meta.data$res.1.4,E16_Dec7v3_epi@meta.data$seq_group),2)
    
     E16_Dec7_mut_7 E16_Dec7_mut_8 E16_Dec7_wt_1 E16_Dec7_wt_6
  0     0.032475749    0.059523810   0.242384964   0.153679654
  1     0.113454239    0.068948413   0.099157485   0.145743146
  10    0.021931674    0.095238095   0.032404407   0.014430014
  11    0.050611556    0.028273810   0.036292936   0.048340548
  12    0.043441586    0.033730159   0.036292936   0.041125541
  13    0.032053986    0.026289683   0.043421905   0.028860029
  14    0.024040489    0.039682540   0.014906027   0.038239538
  15    0.051455082    0.022321429   0.005832793   0.014430014
  16    0.009700548    0.041666667   0.011665587   0.041847042
  17    0.029523408    0.024305556   0.002592353   0.020923521
  18    0.012652889    0.011904762   0.009073234   0.012987013
  2     0.099114298    0.112599206   0.050550875   0.084415584
  3     0.074230283    0.051091270   0.106934543   0.093073593
  4     0.088570224    0.096726190   0.053143227   0.057720058
  5     0.043019823    0.086805556   0.079066753   0.059884560
  6     0.147195276    0.023809524   0.030460143   0.023809524
  7     0.060733868    0.041666667   0.059624109   0.043290043
  8     0.014339941    0.082837302   0.053791316   0.046176046
  9     0.051455082    0.052579365   0.032404407   0.031024531

E16_Dec7v3_epi@meta.data$cell_type<-mapvalues(E16_Dec7v3_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"),to=c("Basal","Basal","Secretory","Basal/Secretory","Secretory","Secretory","Secretory","Ciliated","Secretory","Secretory","Secretory","Ciliated","Secretory","Basal","Doublet","Ciliated","Secretory","Doublet","Doublet"))
c14, 17 and c18 are doublets.

table(E16_Dec7v3_epi@meta.data$cell_type[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))],E16_Dec7v3_epi@meta.data$genotype[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))])
                 
                   mut   wt
  Basal            734 1049
  Basal/Secretory  279  294
  Ciliated         572  304
  Secretory       2492 1141
DE_E16_secretory_genotype<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="wt" & E16_Dec7v3_epi@meta.data$cell_type=="Secretory" )),cells.2<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="mut" & E16_Dec7v3_epi@meta.data$cell_type=="Secretory" )),only.pos = F,logfc.threshold=0,min.pct=0)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~30m 46s      
   |+                                                 | 2 % ~30m 22s      
   |++                                                | 3 % ~30m 21s      
   |++                                                | 4 % ~30m 15s      
   |+++                                               | 5 % ~29m 42s      
   |+++                                               | 6 % ~29m 17s      
   |++++                                              | 7 % ~28m 51s      
   |++++                                              | 8 % ~28m 30s      
   |+++++                                             | 9 % ~28m 06s      
   |+++++                                             | 10% ~27m 47s      
   |++++++                                            | 11% ~27m 28s      
   |++++++                                            | 12% ~27m 08s      
   |+++++++                                           | 13% ~26m 51s      
   |+++++++                                           | 14% ~26m 32s      
   |++++++++                                          | 15% ~26m 14s      
   |++++++++                                          | 16% ~25m 55s      
   |+++++++++                                         | 17% ~25m 37s      
   |+++++++++                                         | 18% ~25m 17s      
   |++++++++++                                        | 19% ~24m 58s      
   |++++++++++                                        | 20% ~24m 43s      
   |+++++++++++                                       | 21% ~24m 25s      
   |+++++++++++                                       | 22% ~24m 07s      
   |++++++++++++                                      | 23% ~23m 51s      
   |++++++++++++                                      | 24% ~23m 31s      
   |+++++++++++++                                     | 25% ~23m 12s      
   |+++++++++++++                                     | 26% ~22m 52s      
   |++++++++++++++                                    | 27% ~22m 34s      
   |++++++++++++++                                    | 28% ~22m 15s      
   |+++++++++++++++                                   | 29% ~21m 55s      
   |+++++++++++++++                                   | 30% ~21m 37s      
   |++++++++++++++++                                  | 31% ~21m 18s      
   |++++++++++++++++                                  | 32% ~20m 59s      
   |+++++++++++++++++                                 | 33% ~20m 40s      
   |+++++++++++++++++                                | 34% ~20m 22s      
   |++++++++++++++++++                                | 35% ~20m 04s      
   |++++++++++++++++++                                | 36% ~19m 46s      
   |+++++++++++++++++++                               | 37% ~19m 28s      
   |+++++++++++++++++++                               | 38% ~19m 10s      
   |++++++++++++++++++++                              | 39% ~18m 51s      
   |++++++++++++++++++++                              | 40% ~18m 33s      
   |+++++++++++++++++++++                             | 41% ~18m 15s      
   |+++++++++++++++++++++                             | 42% ~17m 57s      
   |++++++++++++++++++++++                            | 43% ~17m 38s      
   |++++++++++++++++++++++                            | 44% ~17m 19s      
   |+++++++++++++++++++++++                           | 45% ~17m 01s      
   |+++++++++++++++++++++++                           | 46% ~16m 42s      
   |++++++++++++++++++++++++                          | 47% ~16m 24s      
   |++++++++++++++++++++++++                          | 48% ~16m 05s      
   |+++++++++++++++++++++++++                         | 49% ~15m 46s      
   |+++++++++++++++++++++++++                         | 50% ~15m 27s      
   |++++++++++++++++++++++++++                        | 51% ~15m 08s      
   |++++++++++++++++++++++++++                        | 52% ~14m 50s      
   |+++++++++++++++++++++++++++                       | 53% ~14m 31s      
   |+++++++++++++++++++++++++++                       | 54% ~14m 13s      
   |++++++++++++++++++++++++++++                      | 55% ~13m 54s      
   |++++++++++++++++++++++++++++                     | 56% ~13m 35s      
   |+++++++++++++++++++++++++++++                     | 57% ~13m 17s      
   |+++++++++++++++++++++++++++++                     | 58% ~12m 58s      
   |++++++++++++++++++++++++++++++                    | 59% ~12m 40s      
   |++++++++++++++++++++++++++++++                    | 60% ~12m 22s      
   |+++++++++++++++++++++++++++++++                   | 61% ~12m 03s      
   |+++++++++++++++++++++++++++++++                   | 62% ~11m 45s      
   |++++++++++++++++++++++++++++++++                  | 63% ~11m 26s      
   |++++++++++++++++++++++++++++++++                  | 64% ~11m 08s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~10m 49s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~10m 31s      
   |++++++++++++++++++++++++++++++++++                | 67% ~10m 12s      
   |++++++++++++++++++++++++++++++++++               | 68% ~09m 53s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~09m 35s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~09m 16s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~08m 58s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~08m 39s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~08m 20s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~08m 02s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~07m 43s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~07m 25s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~07m 06s      
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~06m 48s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~06m 29s      
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~06m 11s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05m 53s      
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05m 34s      
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05m 15s      
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04m 57s      
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04m 38s      
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04m 20s      
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04m 01s      
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03m 42s      
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03m 24s      
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03m 05s      
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02m 47s      
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02m 28s      
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02m 10s      
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01m 51s      
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01m 33s      
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01m 14s      
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~56s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~37s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 30m 50s
DE_E16_secretory_genotype
library(ggrepel)
DE_E16_secretory_genotype$gene<-rownames(DE_E16_secretory_genotype)
DE_E16_secretory_genotype$sig<-DE_E16_secretory_genotype$p_val_adj<0.001
volc = ggplot(DE_E16_secretory_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=sig)) + #add points colored by significance
    scale_color_manual(values=c("black", "red")) + 
    ggtitle("E16secretory_wt/mut") + geom_text_repel(data=head(DE_E16_secretory_genotype, 20), aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") + 
  scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))
volc

E16_Dec7v3_epi@meta.data$specific_type<-mapvalues(E16_Dec7v3_epi@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"),to=c("Basal-Krt14","Basal","Secretory-Krt4","Basal/Secretory","Secretory-Krt4","Secretory","Secretory-Krt4","Ciliated","Secretory","Secretory-Krt4","Secretory-Krt4","Ciliated","CyclingSecretory","CyclingBasal","Doublet","Ciliated","Secretory","Doublet","Doublet"))
table(E16_Dec7v3_epi@meta.data$specific_type[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))],E16_Dec7v3_epi@meta.data$genotype[!(E16_Dec7v3_epi@meta.data$res.1.4 %in% c(14,17,18))])
                  
                    mut   wt
  Basal             408  355
  Basal/Secretory   279  294
  Basal-Sostdc1     197  587
  Ciliated          572  304
  CyclingBasal      129  107
  CyclingSecretory  171  113
  Secretory         585  428
  Secretory-Krt4   1736  600

markers for specific clusters:

print(levels(E16_Dec7v3_epi@ident))
[1] "Basal"            "Basal/Secretory"  "Basal-Sostdc1"    "Ciliated"         "CyclingBasal"     "CyclingSecretory" "Doublet"          "Secretory"       
[9] "Secretory-Krt4"  

different populations of basal cells:

write.table(E16_Dec_epi_res14_0over1,"epiSubset_res14_c0overC1.txt",sep="\t")
library(ggrepel)
E16_Dec_epi_res14_0over1$gene<-rownames(E16_Dec_epi_res14_0over1)
E16_Dec_epi_res14_0over1$sig<-E16_Dec_epi_res14_0over1$p_val_adj<0.001
volc = ggplot(E16_Dec_epi_res14_0over1, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=sig)) + #add points colored by significance
    scale_color_manual(values=c("black", "red")) + 
    ggtitle("E16_epi_0over1") 

E16_Dec_epi_res14_0over1_volc.1 <- volc + geom_text_repel(data=head(E16_Dec_epi_res14_0over1, 20), aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") + 
  scale_fill_discrete(labels = c("Not Sig", "adjusted pval < 0.001"))

E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_1over0<-FindMarkers(E16_Dec7v3_epi,ident.1=c(1),ident.2 = c(0),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05s          
   |++                                                | 3 % ~05s          
   |++                                                | 4 % ~04s          
   |+++                                               | 5 % ~03s          
   |++++                                              | 6 % ~03s          
   |++++                                              | 8 % ~03s          
   |+++++                                             | 9 % ~03s          
   |++++++                                            | 10% ~03s          
   |++++++                                            | 11% ~02s          
   |+++++++                                           | 13% ~02s          
   |+++++++                                           | 14% ~02s          
   |++++++++                                          | 15% ~02s          
   |+++++++++                                         | 16% ~02s          
   |+++++++++                                         | 18% ~02s          
   |++++++++++                                        | 19% ~02s          
   |+++++++++++                                       | 20% ~02s          
   |+++++++++++                                       | 22% ~02s          
   |++++++++++++                                      | 23% ~02s          
   |+++++++++++++                                     | 24% ~02s          
   |+++++++++++++                                     | 25% ~02s          
   |++++++++++++++                                    | 27% ~02s          
   |++++++++++++++                                    | 28% ~02s          
   |+++++++++++++++                                   | 29% ~02s          
   |++++++++++++++++                                  | 30% ~02s          
   |++++++++++++++++                                  | 32% ~02s          
   |+++++++++++++++++                                 | 33% ~02s          
   |++++++++++++++++++                                | 34% ~02s          
   |++++++++++++++++++                                | 35% ~02s          
   |+++++++++++++++++++                               | 37% ~01s          
   |+++++++++++++++++++                               | 38% ~01s          
   |++++++++++++++++++++                              | 39% ~01s          
   |+++++++++++++++++++++                             | 41% ~01s          
   |+++++++++++++++++++++                             | 42% ~01s          
   |++++++++++++++++++++++                            | 43% ~01s          
   |+++++++++++++++++++++++                           | 44% ~01s          
   |+++++++++++++++++++++++                           | 46% ~01s          
   |++++++++++++++++++++++++                          | 47% ~01s          
   |+++++++++++++++++++++++++                         | 48% ~01s          
   |+++++++++++++++++++++++++                         | 49% ~01s          
   |++++++++++++++++++++++++++                        | 51% ~01s          
   |++++++++++++++++++++++++++                        | 52% ~01s          
   |+++++++++++++++++++++++++++                       | 53% ~01s          
   |++++++++++++++++++++++++++++                      | 54% ~01s          
   |++++++++++++++++++++++++++++                      | 56% ~01s          
   |+++++++++++++++++++++++++++++                     | 57% ~01s          
   |++++++++++++++++++++++++++++++                    | 58% ~01s          
   |++++++++++++++++++++++++++++++                    | 59% ~01s          
   |+++++++++++++++++++++++++++++++                   | 61% ~01s          
   |++++++++++++++++++++++++++++++++                  | 62% ~01s          
   |++++++++++++++++++++++++++++++++                  | 63% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
   |++++++++++++++++++++++++++++++++++                | 67% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02s
E16_Dec_epi_res14_1over0
write.table(E16_Dec_epi_res14_1over0,"epiSubset_res14_c1overC0.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_9over1<-FindMarkers(E16_Dec7v3_epi,ident.1=c(9),ident.2 = c(1),only.pos = TRUE)
E16_Dec_epi_res14_9over1
write.table(E16_Dec_epi_res14_9over1,"epiSubset_res14_c9overC1.txt",sep="\t")
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec_epi_res14_1over9<-FindMarkers(E16_Dec7v3_epi,ident.1=c(1),ident.2 = c(9),only.pos = TRUE)
E16_Dec_epi_res14_1over9
write.table(E16_Dec_epi_res14_1over9,"epiSubset_res14_c1overC9.txt",sep="\t")

different populations of ciliated cells:

different populations of secretory cells:

Sostdc1 seems to be downregulated in mutant basal-Sostdc1 population.
epi_marker_c0_mut_wt<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,ident=0,cells.use = E16_Dec7v3_epi@meta.data$genotype=="mut"),cells.2<-WhichCells(object=E16_Dec7v3_epi,ident=0,cells.use = E16_Dec7v3_epi@meta.data$genotype=="wt"),only.pos = TRUE)
epi_marker_c0_mut_wt
E16_Dec7v3_epi@meta.data$type_genotype<-as.factor(paste(E16_Dec7v3_epi@meta.data$cell_type,E16_Dec7v3_epi@meta.data$genotype,sep="_"))

DE_E16_ciliated_genotype<-FindMarkers(E16_Dec7v3_epi,cells.1<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="wt" & E16_Dec7v3_epi@meta.data$cell_type=="Ciliated" )),cells.2<-WhichCells(object=E16_Dec7v3_epi,cells.use = (E16_Dec7v3_epi@meta.data$genotype=="mut" & E16_Dec7v3_epi@meta.data$cell_type=="Ciliated" )),only.pos = F,logfc.threshold=0,min.pct=0.05)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05m 51s      
   |+                                                 | 2 % ~05m 39s      
   |++                                                | 3 % ~05m 36s      
   |++                                                | 4 % ~05m 29s      
   |+++                                               | 5 % ~05m 29s      
   |+++                                               | 6 % ~05m 23s      
   |++++                                              | 7 % ~05m 20s      
   |++++                                              | 8 % ~05m 15s      
   |+++++                                             | 9 % ~05m 14s      
   |+++++                                             | 10% ~05m 09s      
   |++++++                                            | 11% ~05m 05s      
   |++++++                                            | 12% ~05m 04s      
   |+++++++                                           | 13% ~05m 02s      
   |+++++++                                           | 14% ~04m 57s      
   |++++++++                                          | 15% ~04m 54s      
   |++++++++                                          | 16% ~04m 50s      
   |+++++++++                                         | 17% ~04m 47s      
   |+++++++++                                         | 18% ~04m 42s      
   |++++++++++                                        | 19% ~04m 39s      
   |++++++++++                                        | 20% ~04m 35s      
   |+++++++++++                                       | 21% ~04m 32s      
   |+++++++++++                                       | 22% ~04m 28s      
   |++++++++++++                                      | 23% ~04m 25s      
   |++++++++++++                                      | 24% ~04m 21s      
   |+++++++++++++                                     | 25% ~04m 18s      
   |+++++++++++++                                     | 26% ~04m 14s      
   |++++++++++++++                                    | 27% ~04m 11s      
   |++++++++++++++                                    | 28% ~04m 08s      
   |+++++++++++++++                                   | 29% ~04m 05s      
   |+++++++++++++++                                   | 30% ~04m 01s      
   |++++++++++++++++                                  | 31% ~03m 58s      
   |++++++++++++++++                                  | 32% ~03m 55s      
   |+++++++++++++++++                                 | 33% ~03m 51s      
   |+++++++++++++++++                                | 34% ~03m 47s      
   |++++++++++++++++++                                | 35% ~03m 44s      
   |++++++++++++++++++                                | 36% ~03m 40s      
   |+++++++++++++++++++                               | 37% ~03m 37s      
   |+++++++++++++++++++                               | 38% ~03m 34s      
   |++++++++++++++++++++                              | 39% ~03m 30s      
   |++++++++++++++++++++                              | 40% ~03m 27s      
   |+++++++++++++++++++++                             | 41% ~03m 24s      
   |+++++++++++++++++++++                             | 42% ~03m 20s      
   |++++++++++++++++++++++                            | 43% ~03m 18s      
   |++++++++++++++++++++++                            | 44% ~03m 14s      
   |+++++++++++++++++++++++                           | 45% ~03m 10s      
   |+++++++++++++++++++++++                           | 46% ~03m 07s      
   |++++++++++++++++++++++++                          | 47% ~03m 03s      
   |++++++++++++++++++++++++                          | 48% ~02m 59s      
   |+++++++++++++++++++++++++                         | 49% ~02m 56s      
   |+++++++++++++++++++++++++                         | 50% ~02m 52s      
   |++++++++++++++++++++++++++                        | 51% ~02m 49s      
   |++++++++++++++++++++++++++                        | 52% ~02m 45s      
   |+++++++++++++++++++++++++++                       | 53% ~02m 41s      
   |+++++++++++++++++++++++++++                       | 54% ~02m 38s      
   |++++++++++++++++++++++++++++                      | 55% ~02m 35s      
   |++++++++++++++++++++++++++++                     | 56% ~02m 31s      
   |+++++++++++++++++++++++++++++                     | 57% ~02m 28s      
   |+++++++++++++++++++++++++++++                     | 58% ~02m 24s      
   |++++++++++++++++++++++++++++++                    | 59% ~02m 21s      
   |++++++++++++++++++++++++++++++                    | 60% ~02m 17s      
   |+++++++++++++++++++++++++++++++                   | 61% ~02m 14s      
   |+++++++++++++++++++++++++++++++                   | 62% ~02m 10s      
   |++++++++++++++++++++++++++++++++                  | 63% ~02m 07s      
   |++++++++++++++++++++++++++++++++                  | 64% ~02m 03s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 60s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 56s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 53s      
   |++++++++++++++++++++++++++++++++++               | 68% ~01m 49s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 46s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 42s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 39s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 35s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 32s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 29s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 25s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01m 22s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01m 18s      
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~01m 15s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01m 12s      
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~01m 08s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01m 05s      
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01m 01s      
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~58s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~54s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~51s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~48s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~44s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~41s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~37s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~34s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~31s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05m 40s
DE_E16_ciliated_genotype
write.table(DE_E16_ciliated_genotype,"DE_E16_ciliated_genotype.txt",sep="\t")
DE_E16_ciliated_genotype$gene<-rownames(DE_E16_ciliated_genotype)
E16_ciliated_automatic_geneList<-DE_E16_ciliated_genotype$gene[DE_E16_ciliated_genotype$p_val_adj<0.001 & abs(DE_E16_ciliated_genotype$avg_logFC)>0.5 & abs(DE_E16_ciliated_genotype$pct.1-DE_E16_ciliated_genotype$pct.2)>0.15]
library(ggrepel)
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_E16_ciliated_genotype$threshold<- ifelse(DE_E16_ciliated_genotype$avg_logFC>0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_E16_ciliated_genotype$avg_logFC<0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_E16_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
  scale_color_manual(values=c("green", "black","magenta"))+
    ggtitle("E16Ciliated_wt/mut") + geom_text_repel(data=DE_E16_ciliated_genotype[DE_E16_ciliated_genotype$gene %in% E16_ciliated_automatic_geneList,], aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") 

PCD genes are not significantly differentially expressed between genotypes:
#DE_P4_secretory_genotype$sig<-DE_P4_secretory_genotype$p_val_adj<0.001
DE_E16_ciliated_genotype$threshold<- ifelse(DE_E16_ciliated_genotype$avg_logFC>0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "wt_enrich",ifelse(DE_E16_ciliated_genotype$avg_logFC<0 & DE_E16_ciliated_genotype$p_val_adj<0.001, "mut_enrich","NotSignificant" ) )
ggplot(DE_E16_ciliated_genotype, aes(avg_logFC, -log10(p_val_adj))) + #volcanoplot with avg_logFC versus p_val_adj
    geom_point(aes(col=threshold),size=0.2) + #add points colored by significance
  scale_color_manual(values=c("green", "black","magenta"))+
    ggtitle("E16Ciliated_wt/mut") + geom_text_repel(data=DE_E16_ciliated_genotype[DE_E16_ciliated_genotype$gene %in% geneList$Primary.ciliary.dyskinesia,], aes(label=gene), point.padding = 1, box.padding = .3) +
  labs(y = expression(-log[10]*" "*"adjusted pvalue"), x = "avg log fold change") + 
  theme(legend.title = element_blank(), legend.position = "top") 

df_E16_epi<-FetchData(E16_Dec7v3_epi,c("Spdef","Creb3l1","Scgb3a2","Scgb1a1","Krt4","Krt13","Foxa3","Aqp3","Aqp4","Aqp5","Gp2","Sostdc1","Smoc2","Krt14","Krt15","Krt5","Rac2","Clic3","res.1.2","res.1.4","genotype","seq_group","specific_type","cell_type","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Muc5b","Muc5ac","Chil4","Muc1","Muc2","Muc4","Muc16","Muc20","Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Lgals3","Reg3g","Nod1","Nod2","Ddx58","Ifih1","Dhx58","Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1","Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
Error in FetchData(E16_Dec7v3_epi, c("Spdef", "Creb3l1", "Scgb3a2", "Scgb1a1",  : 
  Error: Chil4 not found
MicrobialSensing:
for (i in c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Ddx58","Ifih1","Dhx58"))
{
pdf(file = paste("Manuscript/MicrobialSensing_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
antimicrobial effectors:
for (i in c("Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Chil4"))
{
pdf(file = paste("Manuscript/Effectors_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Error in FUN(X[[i]], ...) : object 'Chil4' not found
chemokines:
for (i in c("Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1"))
{
pdf(file = paste("Manuscript/chemokines_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}
Th2:
for (i in c("Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg"))
{
pdf(file = paste("Manuscript/Th2_genotype/E16/",i,".pdf", sep = ""), width = 6, height = 5)
print(ggplot(df_E16_epi,aes_string(x="genotype",y=i))+facet_grid(.~cell_type)+geom_dotplot(binaxis="y",aes(fill=genotype),binwidth=0.05,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("wt", "mut")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=genotype),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0)))
dev.off()
}

explore genes correlated with basal–>secretory changes:
c3 is the basal/secretory population
E16_Dec7v3_epi <- SetAllIdent(object = E16_Dec7v3_epi, id = "res.1.4")
E16_Dec7v3_epi_subc3<-SubsetData(object=E16_Dec7v3_epi,ident.use=c(3))
table(E16_Dec7v3_epi_subc3@meta.data$res.1.4)
E16_Dec7v3_epi_subc3@meta.data<-E16_Dec7v3_epi_subc3@meta.data[,-which(names(E16_Dec7v3_epi_subc3@meta.data) %in% c("res.0.8", "res.1.2", "res.1.4", "res.1.6"))] #remove old metadata
E16_Dec7v3_epi_subc3 <- ScaleData(object = E16_Dec7v3_epi_subc3)
E16_Dec7v3_epi_subc3 <- FindVariableGenes(object = E16_Dec7v3_epi_subc3, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
E16_Dec7v3_epi_subc3 <- RunPCA(object = E16_Dec7v3_epi_subc3, do.print = FALSE)
PCAPlot(E16_Dec7v3_epi_subc3)

PCElbowPlot(object = E16_Dec7v3_epi_subc3)
n.pcs.sub3 = 13
resolution parameter sets the ‘granularity’ of the downstream clustering, with increased values leading to a greater number of clusters.
res.used <- 1.2
E16_Dec7v3_epi_subc3 <- FindClusters(object = E16_Dec7v3_epi_subc3, reduction.type = "pca", dims.use = 1:n.pcs.sub3, 
                     resolution = res.used, print.output = 0, force.recalc = T)
E16_Dec7v3_epi_subc3 <- RunTSNE(object = E16_Dec7v3_epi_subc3, dims.use = 1:n.pcs.sub3, perplexity=30)
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
res.used <- 0.8
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
res.used <- 0.6
TSNEPlot(object = E16_Dec7v3_epi_subc3, do.label = T)
E16_Dec7v3_epi_subc3 <- SetAllIdent(object = E16_Dec7v3_epi_subc3, id = "res.0.6")
DoHeatmap(object = E16_Dec7v3_epi_subc3, genes.use = c("Epcam","Krt8","Trp63","Krt5","Mki67","Top2a","Smoc2","Ccl20","Sostdc1","Bmp7","Clic3","Cldn10","Tspan33","Ehf","Sfta2","Crip2","Msln","Cyp2s1","Cldn3","Cldn7","Cldn4","AU021092","Tspan1","Chad","Tspan13","Klk10","Klk11","Klk13","Ces1d","Krt4","Krt13","Creb3l1"), 
    slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = T
  )
cor(E16_Dec7v3_epi_subc3@scale.data["Trp63",], E16_Dec7v3_epi_subc3@scale.data["Creb3l1",])
cor(E16_Dec7v3_epi_subc3@data["Trp63",], E16_Dec7v3_epi_subc3@data["Spdef",])
Trp63_cor<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor(E16_Dec7v3_epi_subc3@scale.data["Trp63",],x)) 
head(Trp63_cor) 
min(Trp63_cor,na.rm = T) 
Trp63_cor_order<-order(Trp63_cor,decreasing=T) 
head(Trp63_cor[Trp63_cor_order],20)
sum(is.na(Trp63_cor[Trp63_cor_order]))
Trp63_cor[Trp63_cor_order][15706:15686]
tail(Trp63_cor[Trp63_cor_order],20)
cor.test(E16_Dec7v3_epi_subc3@scale.data["Spdef",], E16_Dec7v3_epi_subc3@scale.data["Trp63",],method="pearson")
cor.test(E16_Dec7v3_epi_subc3@scale.data["Spdef",], E16_Dec7v3_epi_subc3@scale.data["Trp63",],method="kendall")
Trp63_cor_test<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor.test(E16_Dec7v3_epi_subc3@scale.data["Trp63",],x,method="pearson")) 
df_Trp63_corTest<-as.data.frame(do.call(rbind, Trp63_cor_test))
df_order_Trp63_corTest<-df_Trp63_corTest[order(unlist(df_Trp63_corTest$estimate)),]
tidy_Trp63_cor<-cbind(df_order_Trp63_corTest$estimate,df_order_Trp63_corTest$p.value)
colnames(tidy_Trp63_cor)<-c("cor","p.value")
head(tidy_Trp63_cor,20)
tidy_Trp63_cor[15706:15686,]
tail(tidy_Trp63_cor)
Krt8_cor_test<-apply(E16_Dec7v3_epi_subc3@scale.data, 1, function(x) cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",],x,method="pearson")) 
df_Krt8_corTest<-as.data.frame(do.call(rbind, Krt8_cor_test))
df_order_Krt8_corTest<-df_Krt8_corTest[order(unlist(df_Krt8_corTest$estimate)),]
sum(is.na(df_order_Krt8_corTest$estimate))
tidy_Krt8_cor<-cbind(df_order_Krt8_corTest$estimate,df_order_Krt8_corTest$p.value)
colnames(tidy_Krt8_cor)<-c("cor","p.value")
head(tidy_Krt8_cor,20)
tidy_Krt8_cor[15666:15706,]
cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",E16_Dec7v3_epi_subc3@meta.data$genotype=="wt"], E16_Dec7v3_epi_subc3@scale.data["Numb",E16_Dec7v3_epi_subc3@meta.data$genotype=="wt"],method="pearson")
cor.test(E16_Dec7v3_epi_subc3@scale.data["Krt8",E16_Dec7v3_epi_subc3@meta.data$genotype=="mut"], E16_Dec7v3_epi_subc3@scale.data["Numb",E16_Dec7v3_epi_subc3@meta.data$genotype=="mut"],method="pearson")
LS0tCnRpdGxlOiAiRTE2X0RlY19zdWJzZXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojbG9hZCgiRTE2X0RlYzd2M19UcmFjaGVhLlJEYXRhIikKYGBgCgojIyMjIyBiYXNhbCwgc2VjcmV0b3J5LCBhbmQgY2lsaWF0ZWQ6CmBgYHtyfQpFMTZfRGVjN3YzX1RyYWNoZWEgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19UcmFjaGVhLCBpZCA9ICJyZXMuMS4yIikKRTE2X0RlYzd2M19lcGk8LVN1YnNldERhdGEob2JqZWN0PUUxNl9EZWM3djNfVHJhY2hlYSxpZGVudC51c2U9YygxLDIwLDE3LDEzLDE5LDYsOSw0LDcpKQp0YWJsZShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuMikKYGBgCmBgYHtyfQpjb2xuYW1lcyhFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEpW2NvbG5hbWVzKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSkgPT0gJ3Jlcy4wLjgnXSA8LSAnb3JpZy4wLjgnCmNvbG5hbWVzKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSlbY29sbmFtZXMoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhKSA9PSAncmVzLjEuMiddIDwtICdvcmlnLjEuMicKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTY2FsZURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGkpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gRmluZFZhcmlhYmxlR2VuZXMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGRvLnBsb3QgPSBUUlVFLCB4Lmxvdy5jdXRvZmY9MC4xLHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KQpgYGAKIyMjIyMjcnVuIFBDQSBvbiB0aGUgc2V0IG9mIGdlbmVzCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBSdW5QQ0Eob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGRvLnByaW50ID0gRkFMU0UpCiNQQ0FQbG90KEUxNl9EZWM3djNfZXBpKQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBQcm9qZWN0UENBKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkby5wcmludCA9IEYpCmBgYAoKYGBge3J9ClBDRWxib3dQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpKQpgYGAKYGBge3IsZmlnLmhlaWdodD01MCxmaWcud2lkdGg9MTV9ClBDSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgcGMudXNlID0gMToyMCwgY2VsbHMudXNlID0gNTAwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gMjUpCgpgYGAKCgpgYGB7cn0Kbi5wY3Muc3ViID0gMTcKYGBgCgpgYGB7cn0KcmVzLnVzZWQgPC0gMS4yCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgCiAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgZm9yY2UucmVjYWxjID0gVCkKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBSdW5UU05FKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViLCBwZXJwbGV4aXR5PTMwKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTl9ClRTTkVQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBkby5sYWJlbCA9IFQscHQuc2l6ZSA9IDAuNCkKYGBgCgojIyMjIyBnZXQgdFNORSBlbWJlZGRpbmcgZm9yIHZlbG9jeXRvOgpgYGB7cn0KRTE2X0RlY19jdjNfSUQ8LXJlYWQuY3N2KGZpbGU9IkUxNl9EZWNfY3YzX0lELmNzdiIsaGVhZGVyPUYsc2VwPSIsIixzdHJpbmdzQXNGYWN0b3JzID0gRikgCgpgYGAKYGBge3J9CmhlYWQoRTE2X0RlY19jdjNfSUQpCgpgYGAKCmBgYHtyfQpFMTZfRGVjX2N2M19uYW1lPC1nc3ViKCJ4IiwiIixFMTZfRGVjX2N2M19JRCkKaGVhZChFMTZfRGVjX2N2M19uYW1lKQpgYGAKYGBge3J9CkUxNl9EZWNfY3YzX25hbWU8LWdzdWIoIjoiLCJfIixFMTZfRGVjX2N2M19uYW1lKQpoZWFkKEUxNl9EZWNfY3YzX25hbWUpCmBgYApgYGB7cn0KVFNORTFfTG9vbW9yZGVyX2VwaTwtRTE2X0RlYzd2M19lcGlAZHIkdHNuZUBjZWxsLmVtYmVkZGluZ3NbbWF0Y2goRTE2X0RlY19jdjNfbmFtZSxyb3duYW1lcyhFMTZfRGVjN3YzX2VwaUBkciR0c25lQGNlbGwuZW1iZWRkaW5ncykpLDFdCndyaXRlKFRTTkUxX0xvb21vcmRlcl9lcGksIlRTTkUxX0xvb21vcmRlcl9lcGkuY3N2IixuY29sdW1ucz0xLHNlcD0iLCIpCmBgYApgYGB7cn0KaGVhZChUU05FMV9Mb29tb3JkZXJfZXBpKQpgYGAKYGBge3J9ClRTTkUyX0xvb21vcmRlcl9lcGk8LUUxNl9EZWM3djNfZXBpQGRyJHRzbmVAY2VsbC5lbWJlZGRpbmdzW21hdGNoKEUxNl9EZWNfY3YzX25hbWUscm93bmFtZXMoRTE2X0RlYzd2M19lcGlAZHIkdHNuZUBjZWxsLmVtYmVkZGluZ3MpKSwyXQp3cml0ZShUU05FMl9Mb29tb3JkZXJfZXBpLCJUU05FMl9Mb29tb3JkZXJfZXBpLmNzdiIsbmNvbHVtbnM9MSxzZXA9IiwiKQoKYGBgCiMjIyMjIG1hcmtlcnMgZm9yIGVhY2ggY2lsaWF0ZWQgcG9wdWxhdGlvbjoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDgpLGlkZW50LjIgPSBjKDEwLDExKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMQpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczEyXzhvdmVyMTAxMSwiZXBpU3Vic2V0X2M4aW5DaWxpYS50eHQiLHNlcD0iXHQiKQoKYGBgCgoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzEwb3ZlcjgxMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDEwKSxpZGVudC4yID0gYyg4LDExKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzEwb3ZlcjgxMQpgYGAKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzEwb3Zlcjg8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxMCksaWRlbnQuMiA9IGMoOCksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxMl8xMG92ZXI4CmBgYApgYGB7cn0Kd3JpdGUudGFibGUoRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyOCwiZXBpU3Vic2V0X2MxMG92ZXJDOC50eHQiLHNlcD0iXHQiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyMTE8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxMCksaWRlbnQuMiA9IGMoMTEpLG9ubHkucG9zID0gVFJVRSkKRTE2X0RlY19lcGlfcmVzMTJfMTBvdmVyMTEKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxMl8xMG92ZXIxMSwiZXBpU3Vic2V0X2MxMG92ZXJDMTEudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3J9CkUxNl9EZWNfZXBpX3JlczEyXzExb3ZlcjgxMDwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDExKSxpZGVudC4yID0gYyg4LDEwKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczEyXzExb3ZlcjgxMApgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxMl8xMW92ZXI4MTAsImVwaVN1YnNldF9jMTFpbkNpbGlhLnR4dCIsc2VwPSJcdCIpCgpgYGAKCgoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0xNn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJGb3hqMSIsIlRvcDJhIiwiTWNpZGFzIiwiQ2NubyIsIkZveG40IiwiU2hpc2E4IiwiTHJyYzIzIiwiUHJyMTgiLCJDZmFwNTMiLCJDZGhyMyIsIlNudG4iLCJJZml0bTEiLCJMYnAiLCJMeTZjMSIsIkx5NmEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IEYsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1tFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuMiAlaW4lIGMoOCwxMCwxMSldLGdyb3VwLm9yZGVyID0gYyg4LDEwLDExKSxncm91cC5jZXggPSAzMCxjZXgucm93ID0gMjAKICApCmBgYAoKCiMjIyMjIHNjb3Jpbmc6CmBgYHtyLGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9Mjh9CkUxNl9EZWM3djNfZXBpQGRhdGFbMTo2LDE6Nl0KCmBgYAoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0yOH0KcGVyY2VudGlsZV90YWJsZV9lcGk8LWFwcGx5KEUxNl9EZWM3djNfZXBpQGRhdGEsMSxwZXJjZW50X3JhbmspCgpgYGAKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0yOH0KcGVyY2VudGlsZV90YWJsZV9lcGlbMTo2LDE6Nl0KCmBgYAoKCmBgYHtyfQpPTUlNZ2VuZTwtcmVhZC5jc3YoZmlsZSA9ICJnZW5lc09NSU0uY3N2IixoZWFkZXI9VCxzZXA9IiwiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQpPTUlNZ2VuZTwtbGFwcGx5KE9NSU1nZW5lLGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdCh1bmxpc3QoeCksc3BsaXQ9IiwiKSkpIApoZWFkKE9NSU1nZW5lJE11Y29jaWxpYXJ5KQpgYGAKYGBge3J9Ck9NSU1nZW5lX211Y29zYUdvYmxldDwtYXMudmVjdG9yKHJlYWQuY3N2KGZpbGUgPSAiZ2VuZXNPTUlNX211Y29zYV9nb2JsZXQuY3N2IixoZWFkZXI9VCxzZXA9IiwiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKVssMV0pCk9NSU1nZW5lX211Y29zYUdvYmxldDwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChPTUlNZ2VuZV9tdWNvc2FHb2JsZXQpLHNwbGl0PSIsIikpCk9NSU1nZW5lX211Y29zYUdvYmxldFs5MDoxMDVdCmBgYApgYGB7cn0KIG1vY29zYUdvYmxldF9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfZXBpWyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX2VwaSkgJWluJSBPTUlNZ2VuZV9tdWNvc2FHb2JsZXRdLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCggbW9jb3NhR29ibGV0X3Njb3JlKQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBtb2Nvc2FHb2JsZXRfc2NvcmUsIGNvbC5uYW1lID0gIm1vY29zYUdvYmxldF9zY29yZSIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJtb2Nvc2FHb2JsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgoKCgoKYGBge3J9CiBjaWxpb3BhdGh5X3RhYmxlPC0gcGVyY2VudGlsZV90YWJsZV9lcGlbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfZXBpKSAlaW4lIE9NSU1nZW5lJENpbGlvcGF0aHldCmBgYAoKYGBge3J9CiBjaWxpb3BhdGh5X3Njb3JlPC0gYXBwbHkoY2lsaW9wYXRoeV90YWJsZSwxLG1lYW4pCmBgYApgYGB7cn0KIGhlYWQoY2lsaW9wYXRoeV9zY29yZSkKYGBgCmBgYHtyfQogUENEX3Njb3JlPC0gYXBwbHkocGVyY2VudGlsZV90YWJsZV9lcGlbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfZXBpKSAlaW4lIE9NSU1nZW5lJFByaW1hcnkuY2lsaWFyeS5keXNraW5lc2lhXSwxLG1lYW4pCmBgYApgYGB7cn0KIGhlYWQoUENEX3Njb3JlKQpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaTwtQWRkTWV0YURhdGEob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIG1ldGFkYXRhID0gY2lsaW9wYXRoeV9zY29yZSwgY29sLm5hbWUgPSAiY2lsaW9wYXRoeV9zY29yZSIpCgpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBQQ0Rfc2NvcmUsIGNvbC5uYW1lID0gIlBDRF9zY29yZSIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJjaWxpb3BhdGh5X3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS4yIikKCmBgYApgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIlBDRF9zY29yZSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuMiIpCgpgYGAKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJQQ0Rfc2NvcmUiKSwgbkNvbCA9IDEsaWRlbnQuaW5jbHVkZSA9IGMoOCwxMCwxMSkseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjIiKQoKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjIiKQoKVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoImNpbGlvcGF0aHlfc2NvcmUiKSwgaWRlbnQuaW5jbHVkZSA9IGMoMTEpLG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzZXFfZ3JvdXAiKQoKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuMiIpCgpWbG5QbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBmZWF0dXJlcy5wbG90ID0gYygiUENEX3Njb3JlIiksIGlkZW50LmluY2x1ZGUgPSBjKDgpLG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzZXFfZ3JvdXAiKQoKYGBgCmBgYHtyfQogbXVjdXNfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX2VwaVssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9lcGkpICVpbiUgYyhPTUlNZ2VuZSRBaXJ3YXkuLi5NdWN1cyxPTUlNZ2VuZSRQdWxtb25hcnkuYW5kLk11Y3VzKV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKG11Y3VzX3Njb3JlKQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpPC1BZGRNZXRhRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgbWV0YWRhdGEgPSBtdWN1c19zY29yZSwgY29sLm5hbWUgPSAibXVjdXNfc2NvcmUiKQoKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIm11Y3VzX3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS40IikKCmBgYApgYGB7cn0KIENPUERfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX2VwaVssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9lcGkpICVpbiUgYyhPTUlNZ2VuZSRDT1BEKV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKENPUERfc2NvcmUpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGk8LUFkZE1ldGFEYXRhKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBtZXRhZGF0YSA9IENPUERfc2NvcmUsIGNvbC5uYW1lID0gIkNPUERfc2NvcmUiKQoKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoIkNPUERfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgpgYGB7cn0KIGFzdGhtYV9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfZXBpWyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX2VwaSkgJWluJSBjKE9NSU1nZW5lJFB1bG1vbmFyeS4uLkFzdGhtYSldLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZChhc3RobWFfc2NvcmUpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGk8LUFkZE1ldGFEYXRhKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBtZXRhZGF0YSA9IGFzdGhtYV9zY29yZSwgY29sLm5hbWUgPSAiYXN0aG1hX3Njb3JlIikKCmBgYAoKYGBge3J9ClZsblBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGZlYXR1cmVzLnBsb3QgPSBjKCJhc3RobWFfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xNH0KZ2dwbG90KEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSxhZXMoZ2Vub3R5cGUsYXN0aG1hX3Njb3JlKSkrZmFjZXRfZ3JpZCgufnJlcy4xLjIpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoY29sb3I9Z2Vub3R5cGUsZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpKQpgYGAKCgoKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjQKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcy5zdWIsIAogICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIGZvcmNlLnJlY2FsYyA9IFQpCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gUnVuVFNORShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZGltcy51c2UgPSAxOm4ucGNzLnN1YiwgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD05fQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjQpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MjJ9CkUxNl9EZWM3djNfZXBpPWJ1aWxkQ2x1c3RlclRyZWUoRTE2X0RlYzd2M19lcGksZG8ucmVvcmRlciA9IEYscmVvcmRlci5udW1lcmljID0gRixwY3MudXNlID0gMToxNykKCmBgYAoKCmBgYHtyfQp0YWJsZShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkc2VxX2dyb3VwKQpgYGAKCmBgYHtyfQpwcm9wLnRhYmxlKHRhYmxlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40LEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRzZXFfZ3JvdXApLDIpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9OSxmaWcud2lkdGg9Mjh9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ1IiwiU29zdGRjMSIsIkNvbDZhMSIsIkNvbDZhMiIsIkNvbDZhMyIsIkJnbiIsIlBvc3RuIiwiVGsxIiwiTWtpNjciLCJUb3AyYSIsIkNyZWIzbDEiLCJNdWM1YWMiLCJHcDIiLCJSYWMyIiwiMTgxMDAxMEgyNFJpayIsIktydDE1IiwiS3J0NCIsIktydDEzIiwibXQtQ28zIiwibXQtQ3l0YiIsIkdhbG50NiIsIlB0Z2RyIiwiQjNnbnQ2IiwiQ2QxNzciLCJGb3huNCIsIkZveGoxIiwiQ2RocjMiLCJBbm8xIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS40IixjZXgucm93ID0gMjAKICApCmBgYApgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZmVhdHVyZXMucGxvdCA9IGMoImRvdWJsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPC1tYXB2YWx1ZXMoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQsZnJvbT1jKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiksdG89YygiQmFzYWwiLCJCYXNhbCIsIlNlY3JldG9yeSIsIkJhc2FsL1NlY3JldG9yeSIsIlNlY3JldG9yeSIsIlNlY3JldG9yeSIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJCYXNhbCIsIkRvdWJsZXQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIkRvdWJsZXQiLCJEb3VibGV0IikpCmBgYAoKCiMjIyMjIGMxNCwgMTcgYW5kIGMxOCBhcmUgZG91YmxldHMuCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KZ2dwbG90KGRhdGE9RTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSksXSxhZXMoc2VxX2dyb3VwLGZpbGw9Y2VsbF90eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpLF0sYWVzKGdlbm90eXBlLGZpbGw9Y2VsbF90eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KdGFibGUoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSxFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGVbIShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMTQsMTcsMTgpKV0pCmBgYApgYGB7cn0KREVfRTE2X3NlY3JldG9yeV9nZW5vdHlwZTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksY2VsbHMuMTwtV2hpY2hDZWxscyhvYmplY3Q9RTE2X0RlYzd2M19lcGksY2VsbHMudXNlID0gKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Ind0IiAmIEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGU9PSJTZWNyZXRvcnkiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGNlbGxzLnVzZSA9IChFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJtdXQiICYgRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IlNlY3JldG9yeSIgKSksb25seS5wb3MgPSBGLGxvZ2ZjLnRocmVzaG9sZD0wLG1pbi5wY3Q9MCkKREVfRTE2X3NlY3JldG9yeV9nZW5vdHlwZQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dyZXBlbCkKYGBgCmBgYHtyfQpERV9FMTZfc2VjcmV0b3J5X2dlbm90eXBlJGdlbmU8LXJvd25hbWVzKERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUpCkRFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9FMTZfc2VjcmV0b3J5X2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMQp2b2xjID0gZ2dwbG90KERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUsIGFlcyhhdmdfbG9nRkMsIC1sb2cxMChwX3ZhbF9hZGopKSkgKyAjdm9sY2Fub3Bsb3Qgd2l0aCBhdmdfbG9nRkMgdmVyc3VzIHBfdmFsX2FkagogICAgZ2VvbV9wb2ludChhZXMoY29sPXNpZykpICsgI2FkZCBwb2ludHMgY29sb3JlZCBieSBzaWduaWZpY2FuY2UKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmxhY2siLCAicmVkIikpICsgCiAgICBnZ3RpdGxlKCJFMTZzZWNyZXRvcnlfd3QvbXV0IikgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1oZWFkKERFX0UxNl9zZWNyZXRvcnlfZ2Vub3R5cGUsIDQwKSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIAogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzID0gYygiTm90IFNpZyIsICJhZGp1c3RlZCBwdmFsIDwgMC4wMDEiKSkKYGBgCmBgYHtyfQp2b2xjCmBgYApgYGB7cn0KRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGU8LW1hcHZhbHVlcyhFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCxmcm9tPWMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiKSx0bz1jKCJCYXNhbC1Tb3N0ZGMxIiwiQmFzYWwiLCJTZWNyZXRvcnktS3J0NCIsIkJhc2FsL1NlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiU2VjcmV0b3J5IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIlNlY3JldG9yeS1LcnQ0IiwiU2VjcmV0b3J5LUtydDQiLCJDaWxpYXRlZCIsIkN5Y2xpbmdTZWNyZXRvcnkiLCJDeWNsaW5nQmFzYWwiLCJEb3VibGV0IiwiQ2lsaWF0ZWQiLCJTZWNyZXRvcnkiLCJEb3VibGV0IiwiRG91YmxldCIpKQpgYGAKCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CnRhYmxlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRzcGVjaWZpY190eXBlWyEoRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDE0LDE3LDE4KSldLEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSkKYGBgCgpgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YVshKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpLF0sYWVzKGdlbm90eXBlLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAojIyMjIyBtYXJrZXJzIGZvciBzcGVjaWZpYyBjbHVzdGVyczoKYGBge3IsZmlnLmhlaWdodD0zLGZpZy53aWR0aD04fQpFMTZfRGVjN3YzX2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInNwZWNpZmljX3R5cGUiKQoKRTE2X0RlYzd2M19lcGlAaWRlbnQ9ZmFjdG9yKEUxNl9EZWM3djNfZXBpQGlkZW50LGxldmVscyhFMTZfRGVjN3YzX2VwaUBpZGVudClbYyg0LDgsOSwyLDEsMyw2LDUsNyldKQpEb3RQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBjb2xzLnVzZSA9IGMoImxpZ2h0Z3JleSIsInJlZCIpLGdlbmVzLnBsb3QgPSBjKCJGb3hqMSIsIlB0Z2RyIiwiQjNnbnQ2IiwiR2FsbnQ2IiwiQ2dyZWYxIiwiR3AyIiwiVGZmMiIsIk11YzViIiwiTXVjMTYiLCJDaXRlZDEiLCJLcnQ0IiwiQ3JlYjNsMSIsIlNwZGVmIiwiQ2xpYzMiLCJDY2wyMCIsIlNvc3RkYzEiLCJTbW9jMiIsIktydDE0IiwiQm1wNyIsIlRycDYzIiwiS3J0NSIsIk1raTY3IiwiVG9wMmEiKSxncm91cC5ieSA9ICJpZGVudCIsIHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKQpgYGAKYGBge3IsZmlnLmhlaWdodD0zLGZpZy53aWR0aD04fQpwcmludChsZXZlbHMoRTE2X0RlYzd2M19lcGlAaWRlbnQpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTI4fQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJUcnA2MyIsIktydDUiLCJLcnQxNCIsIlNvc3RkYzEiLCJUazEiLCJNa2k2NyIsIlRvcDJhIiwiU3BkZWYiLCJDcmViM2wxIiwiTXVjNWIiLCJNdWM1YWMiLCJHcDIiLCJLcnQxNSIsIktydDQiLCJLcnQxMyIsIkZveG40IiwiTWNpZGFzIiwiRm94ajEiLCJDZGhyMyIsIkFubzEiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuYnk9InJlcy4xLjQiLGNlbGxzLnVzZSA9IEUxNl9EZWM3djNfZXBpQGNlbGwubmFtZXNbIShFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMTQsMTcsMTgpKV0KICApCmBgYApgYGB7cixmaWcuaGVpZ2h0PTE1LGZpZy53aWR0aD00NX0KCkRvSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZ2VuZXMudXNlID0gYygiVHJwNjMiLCJLcnQ1IiwiS3J0MTQiLCJTb3N0ZGMxIiwiVGsxIiwiTWtpNjciLCJUb3AyYSIsIlNmdHBiIiwiS3J0NCIsIktydDEzIiwiQ2xpYzMiLCJTcGRlZiIsIkNyZWIzbDEiLCJNdWM1YiIsIkdwMiIsIkZveGoxIiwiQW5vMSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0ic3BlY2lmaWNfdHlwZSIsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1shKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwxNywxOCkpXSxjZXgucm93ID0gMzAsZ3JvdXAuY2V4ID0gNTAsZ3JvdXAub3JkZXIgPSBjKCJCYXNhbC1Tb3N0ZGMxIiwiQ3ljbGluZ0Jhc2FsIiwiQmFzYWwiLCJCYXNhbC9TZWNyZXRvcnkiLCJDeWNsaW5nU2VjcmV0b3J5IiwiU2VjcmV0b3J5LUtydDQiLCJTZWNyZXRvcnkiLCJDaWxpYXRlZCIpCiAgKQpgYGAKCgpgYGB7cn0Kc2F2ZShFMTZfRGVjN3YzX2VwaSxmaWxlPSJFMTZfRGVjN3YzX2VwaS5SRGF0YSIpCmBgYAojIyMjIGRpZmZlcmVudCBwb3B1bGF0aW9ucyBvZiBiYXNhbCBjZWxsczoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxPC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxpZGVudC4xPWMoMCksaWRlbnQuMiA9IGMoMSksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjEsImVwaVN1YnNldF9yZXMxNF9jMG92ZXJDMS50eHQiLHNlcD0iXHQiKQoKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncmVwZWwpCmBgYApgYGB7cn0KRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxJGdlbmU8LXJvd25hbWVzKEUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMSkKRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxJHNpZzwtRTE2X0RlY19lcGlfcmVzMTRfMG92ZXIxJHBfdmFsX2FkajwwLjAwMQp2b2xjID0gZ2dwbG90KEUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMSwgYWVzKGF2Z19sb2dGQywgLWxvZzEwKHBfdmFsX2FkaikpKSArICN2b2xjYW5vcGxvdCB3aXRoIGF2Z19sb2dGQyB2ZXJzdXMgcF92YWxfYWRqCiAgICBnZW9tX3BvaW50KGFlcyhjb2w9c2lnKSkgKyAjYWRkIHBvaW50cyBjb2xvcmVkIGJ5IHNpZ25pZmljYW5jZQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibGFjayIsICJyZWQiKSkgKyAKICAgIGdndGl0bGUoIkUxNl9lcGlfMG92ZXIxIikgCgpFMTZfRGVjX2VwaV9yZXMxNF8wb3ZlcjFfdm9sYy4xIDwtIHZvbGMgKyBnZW9tX3RleHRfcmVwZWwoZGF0YT1oZWFkKEUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMSwgMjApLCBhZXMobGFiZWw9Z2VuZSksIHBvaW50LnBhZGRpbmcgPSAxLCBib3gucGFkZGluZyA9IC4zKSArCiAgbGFicyh5ID0gZXhwcmVzc2lvbigtbG9nWzEwXSoiICIqImFkanVzdGVkIHB2YWx1ZSIpLCB4ID0gImF2ZyBsb2cgZm9sZCBjaGFuZ2UiKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOb3QgU2lnIiwgImFkanVzdGVkIHB2YWwgPCAwLjAwMSIpKQpgYGAKYGBge3J9CkUxNl9EZWNfZXBpX3JlczE0XzBvdmVyMV92b2xjLjEKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpFMTZfRGVjX2VwaV9yZXMxNF8xb3ZlcjA8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGlkZW50LjE9YygxKSxpZGVudC4yID0gYygwKSxvbmx5LnBvcyA9IFRSVUUpCkUxNl9EZWNfZXBpX3JlczE0XzFvdmVyMApgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNl9EZWNfZXBpX3JlczE0XzFvdmVyMCwiZXBpU3Vic2V0X3JlczE0X2Mxb3ZlckMwLnR4dCIsc2VwPSJcdCIpCgpgYGAKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuNCIpCkUxNl9EZWNfZXBpX3JlczE0XzlvdmVyMTwtRmluZE1hcmtlcnMoRTE2X0RlYzd2M19lcGksaWRlbnQuMT1jKDkpLGlkZW50LjIgPSBjKDEpLG9ubHkucG9zID0gVFJVRSkKRTE2X0RlY19lcGlfcmVzMTRfOW92ZXIxCmBgYApgYGB7cn0Kd3JpdGUudGFibGUoRTE2X0RlY19lcGlfcmVzMTRfOW92ZXIxLCJlcGlTdWJzZXRfcmVzMTRfYzlvdmVyQzEudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRTE2X0RlY19lcGlfcmVzMTRfMW92ZXI5PC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxpZGVudC4xPWMoMSksaWRlbnQuMiA9IGMoOSksb25seS5wb3MgPSBUUlVFKQpFMTZfRGVjX2VwaV9yZXMxNF8xb3ZlcjkKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTZfRGVjX2VwaV9yZXMxNF8xb3ZlcjksImVwaVN1YnNldF9yZXMxNF9jMW92ZXJDOS50eHQiLHNlcD0iXHQiKQoKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MzB9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKRG9IZWF0bWFwKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBnZW5lcy51c2UgPSBjKCJFcGNhbSIsIktydDgiLCJUcnA2MyIsIktydDUiLCJNa2k2NyIsIlRvcDJhIiwiU21vYzIiLCJDY2wyMCIsIlNvc3RkYzEiLCJCbXA3IiwiQ2xpYzMiLCJDbGRuMTAiLCJUc3BhbjMzIiwiRWhmIiwiU2Z0YTIiLCJDcmlwMiIsIk1zbG4iLCJDeXAyczEiLCJDbGRuMyIsIkNsZG43IiwiQ2xkbjQiLCJBVTAyMTA5MiIsIlRzcGFuMSIsIkNoYWQiLCJUc3BhbjEzIiwiS2xrMTAiLCJLbGsxMSIsIktsazEzIiwiQ2VzMWQiLCJLcnQ0IiwiS3J0MTMiLCJDcmViM2wxIiwiU3BkZWYiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAY2VsbC5uYW1lc1tFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMCwxMywxLDMsOSldLGdyb3VwLm9yZGVyID0gYygwLDEzLDEsMyw5KSxjZXgucm93ID0gMjAsZ3JvdXAuY2V4ID0gMzAKICApCmBgYAojIyMjIyBkaWZmZXJlbnQgcG9wdWxhdGlvbnMgb2YgY2lsaWF0ZWQgY2VsbHM6CmBgYHtyLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MTZ9CkUxNl9EZWM3djNfZXBpIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpLCBpZCA9ICJyZXMuMS40IikKCkRvSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZ2VuZXMudXNlID0gYygiRm94ajEiLCJTaGlzYTgiLCJNY2lkYXMiLCJDY25vIiwiUGxrNCIsIkh5bHMxIiwiRm94bjQiLCJMcnJjMjMiLCJQcnIxOCIsIkNmYXA1MyIsIkNkaHIzIiwiQ2RocjQiLCJMZGxyYWQxIiwiU250biIsIklmaXRtMSIsIkxicCIsIkx5NmMxIiwiTHk2YSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxjZWxscy51c2UgPSBFMTZfRGVjN3YzX2VwaUBjZWxsLm5hbWVzW0UxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYyg3LDExLDE1KV0sZ3JvdXAub3JkZXIgPSBjKDcsMTEsMTUpLGdyb3VwLmNleCA9IDMwLGNleC5yb3cgPSAyMAogICkKYGBgCiMjIyMjIGRpZmZlcmVudCBwb3B1bGF0aW9ucyBvZiBzZWNyZXRvcnkgY2VsbHM6CmBgYHtyLGZpZy5oZWlnaHQ9MTAsZmlnLndpZHRoPTMwfQpFMTZfRGVjN3YzX2VwaSA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAicmVzLjEuNCIpCkRvSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgZ2VuZXMudXNlID0gYygiRXBjYW0iLCJNa2k2NyIsIlRvcDJhIiwiU2Z0cGIiLCJIcCIsIktydDQiLCJLcnQxMyIsIkxnYWxzMyIsIkNsaWMzIiwiU2VjMTRsMyIsIktydDgiLCJLcnQxOCIsIk11YzE2IiwiQ3JlYjNsMSIsIlNwZGVmIiwiTXVjNWFjIiwiTXVjNWIiLCJGb3hhMyIsIkZrYnAxMSIsIkdhbG50MTIiLCJMdGYiLCJHcDIiLCJUZmYyIiwiR2FsbnQ2IiwiUHRnZHIiLCJDZDE3NyIpLAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGNlbGxzLnVzZSA9IEUxNl9EZWM3djNfZXBpQGNlbGwubmFtZXNbRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDYsMiw0LDUsMTIsOCwxMCwxNildLGdyb3VwLm9yZGVyID0gYygxMiw2LDQsMiwxMCw1LDgsMTYpLGNleC5jb2w9MSxjZXgucm93ID0gMjAsZ3JvdXAuY2V4ID0gMzAKICApCmBgYAoKCgpgYGB7cn0KZXBpX21hcmtlcl9jMF93dF9tdXQ8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50PTAsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiKSxjZWxscy4yPC1XaGljaENlbGxzKG9iamVjdD1FMTZfRGVjN3YzX2VwaSxpZGVudD0wLGNlbGxzLnVzZSA9IEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIpLG9ubHkucG9zID0gVFJVRSkKZXBpX21hcmtlcl9jMF93dF9tdXQKYGBgCiMjIyMjIFNvc3RkYzEgc2VlbXMgdG8gYmUgZG93bnJlZ3VsYXRlZCBpbiBtdXRhbnQgYmFzYWwtU29zdGRjMSBwb3B1bGF0aW9uLgoKYGBge3J9CmVwaV9tYXJrZXJfYzBfbXV0X3d0PC1GaW5kTWFya2VycyhFMTZfRGVjN3YzX2VwaSxjZWxscy4xPC1XaGljaENlbGxzKG9iamVjdD1FMTZfRGVjN3YzX2VwaSxpZGVudD0wLGNlbGxzLnVzZSA9IEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCIpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGlkZW50PTAsY2VsbHMudXNlID0gRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlPT0id3QiKSxvbmx5LnBvcyA9IFRSVUUpCmVwaV9tYXJrZXJfYzBfbXV0X3d0CmBgYAoKCmBgYHtyfQpFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkdHlwZV9nZW5vdHlwZTwtYXMuZmFjdG9yKHBhc3RlKEUxNl9EZWM3djNfZXBpQG1ldGEuZGF0YSRjZWxsX3R5cGUsRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGdlbm90eXBlLHNlcD0iXyIpKQpgYGAKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD02fQpFMTZfRGVjN3YzX2VwaTwtU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInR5cGVfZ2Vub3R5cGUiKQoKRTE2X0RlYzd2M19lcGlAaWRlbnQ9ZmFjdG9yKEUxNl9EZWM3djNfZXBpQGlkZW50LGxldmVscyhFMTZfRGVjN3YzX2VwaUBpZGVudClbYygxLDQsMiwzLDksMTAsNSw2LDcsOCldKSAgI2p1c3QgdG8gcmVvcmRlciB0aGUgZ3JvdXBzCkRvdFBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGNvbHMudXNlID0gYygieWVsbG93IiwicmVkIiksZ2VuZXMucGxvdCA9IHJldihjKCJTZnRwYTEiLCJNdWM1YWMiLCJNdWMyIiwiTXVjMjAiLCJNdWM1YiIsIk11YzEiLCJNdWMxNiIsIk11YzQiLCJQaWdyIiwiTHRmIiwiTHl6MiIsIlNscGkiLCJMY24yIiwiU2Z0cGQiLCJTZnRwYiIsIkRlZmIxIikpLHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBULGdyb3VwLmJ5ID0gImlkZW50Iixkby5yZXR1cm49VCkrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgCmBgYApgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTZ9CkUxNl9EZWM3djNfZXBpPC1TZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaSwgaWQgPSAidHlwZV9nZW5vdHlwZSIpCgpFMTZfRGVjN3YzX2VwaUBpZGVudD1mYWN0b3IoRTE2X0RlYzd2M19lcGlAaWRlbnQsbGV2ZWxzKEUxNl9EZWM3djNfZXBpQGlkZW50KVtjKDEsNCwyLDMsOSwxMCw1LDYsNyw4KV0pCkRvdFBsb3Qob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGNvbHMudXNlID0gYygieWVsbG93IiwicmVkIiksZ2VuZXMucGxvdCA9IHJldihjKCJOZmtiaWEiLCJOZmtiaXoiLCJSZXRubGEiLCJDeGNsMTciLCJDeGNsMTUiLCJDY2wyMCIsIkFyZWciLCJNdWM1YiIsIk11YzQiLCJQaWdyIiwiTHRmIiwiTHl6MiIsIlNscGkiLCJMY24yIiwiU2Z0cGQiLCJTZnRwYiIsIkRlZmIxIiwiTGdhbHMzIiwiSXRsbjEiKSkseC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsZ3JvdXAuYnkgPSAiaWRlbnQiLGRvLnJldHVybj1UKStyb3RhdGUoKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLGhqdXN0PTEpKSAKYGBgCmBgYHtyfQpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGU8LUZpbmRNYXJrZXJzKEUxNl9EZWM3djNfZXBpLGNlbGxzLjE8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGNlbGxzLnVzZSA9IChFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCIgJiBFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkY2VsbF90eXBlPT0iQ2lsaWF0ZWQiICkpLGNlbGxzLjI8LVdoaWNoQ2VsbHMob2JqZWN0PUUxNl9EZWM3djNfZXBpLGNlbGxzLnVzZSA9IChFMTZfRGVjN3YzX2VwaUBtZXRhLmRhdGEkZ2Vub3R5cGU9PSJtdXQiICYgRTE2X0RlYzd2M19lcGlAbWV0YS5kYXRhJGNlbGxfdHlwZT09IkNpbGlhdGVkIiApKSxvbmx5LnBvcyA9IEYsbG9nZmMudGhyZXNob2xkPTAsbWluLnBjdD0wLjA1KQpERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUKYGBgCgpgYGB7cn0Kd3JpdGUudGFibGUoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlLCJERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUudHh0IixzZXA9Ilx0IikKYGBgCgoKYGBge3J9CkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRnZW5lPC1yb3duYW1lcyhERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUpCkUxNl9jaWxpYXRlZF9hdXRvbWF0aWNfZ2VuZUxpc3Q8LURFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRnZW5lW0RFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEgJiBhYnMoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQyk+MC41ICYgYWJzKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwY3QuMS1ERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcGN0LjIpPjAuMTVdCmBgYApgYGB7cn0KbGlicmFyeShnZ3JlcGVsKQpgYGAKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD0xMn0KCiNERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkc2lnPC1ERV9QNF9zZWNyZXRvcnlfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxCkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSR0aHJlc2hvbGQ8LSBpZmVsc2UoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQz4wICYgREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgInd0X2VucmljaCIsaWZlbHNlKERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRhdmdfbG9nRkM8MCAmIERFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEsICJtdXRfZW5yaWNoIiwiTm90U2lnbmlmaWNhbnQiICkgKQpnZ3Bsb3QoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlLCBhZXMoYXZnX2xvZ0ZDLCAtbG9nMTAocF92YWxfYWRqKSkpICsgI3ZvbGNhbm9wbG90IHdpdGggYXZnX2xvZ0ZDIHZlcnN1cyBwX3ZhbF9hZGoKICAgIGdlb21fcG9pbnQoYWVzKGNvbD10aHJlc2hvbGQpLHNpemU9MC4yKSArICNhZGQgcG9pbnRzIGNvbG9yZWQgYnkgc2lnbmlmaWNhbmNlCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJncmVlbiIsICJibGFjayIsIm1hZ2VudGEiKSkrCiAgICBnZ3RpdGxlKCJFMTZDaWxpYXRlZF93dC9tdXQiKSArIGdlb21fdGV4dF9yZXBlbChkYXRhPURFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIEUxNl9jaWxpYXRlZF9hdXRvbWF0aWNfZ2VuZUxpc3QsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCiMjIyMjIFBDRCBnZW5lcyBhcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGJldHdlZW4gZ2Vub3R5cGVzOgpgYGB7cixmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTEyfQoKI0RFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRzaWc8LURFX1A0X3NlY3JldG9yeV9nZW5vdHlwZSRwX3ZhbF9hZGo8MC4wMDEKREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHRocmVzaG9sZDwtIGlmZWxzZShERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkYXZnX2xvZ0ZDPjAgJiBERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkcF92YWxfYWRqPDAuMDAxLCAid3RfZW5yaWNoIixpZmVsc2UoREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJGF2Z19sb2dGQzwwICYgREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlJHBfdmFsX2FkajwwLjAwMSwgIm11dF9lbnJpY2giLCJOb3RTaWduaWZpY2FudCIgKSApCmdncGxvdChERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUsIGFlcyhhdmdfbG9nRkMsIC1sb2cxMChwX3ZhbF9hZGopKSkgKyAjdm9sY2Fub3Bsb3Qgd2l0aCBhdmdfbG9nRkMgdmVyc3VzIHBfdmFsX2FkagogICAgZ2VvbV9wb2ludChhZXMoY29sPXRocmVzaG9sZCksc2l6ZT0wLjIpICsgI2FkZCBwb2ludHMgY29sb3JlZCBieSBzaWduaWZpY2FuY2UKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImdyZWVuIiwgImJsYWNrIiwibWFnZW50YSIpKSsKICAgIGdndGl0bGUoIkUxNkNpbGlhdGVkX3d0L211dCIpICsgZ2VvbV90ZXh0X3JlcGVsKGRhdGE9REVfRTE2X2NpbGlhdGVkX2dlbm90eXBlW0RFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRnZW5lICVpbiUgZ2VuZUxpc3QkUHJpbWFyeS5jaWxpYXJ5LmR5c2tpbmVzaWEsXSwgYWVzKGxhYmVsPWdlbmUpLCBwb2ludC5wYWRkaW5nID0gMSwgYm94LnBhZGRpbmcgPSAuMykgKwogIGxhYnMoeSA9IGV4cHJlc3Npb24oLWxvZ1sxMF0qIiAiKiJhZGp1c3RlZCBwdmFsdWUiKSwgeCA9ICJhdmcgbG9nIGZvbGQgY2hhbmdlIikgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAKYGBgCgpgYGB7cn0KCkRFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZVtERV9FMTZfY2lsaWF0ZWRfZ2Vub3R5cGUkZ2VuZSAlaW4lIGdlbmVMaXN0JFByaW1hcnkuY2lsaWFyeS5keXNraW5lc2lhLF0KYGBgCmBgYHtyfQoKREVfRTE2X2NpbGlhdGVkX2dlbm90eXBlW0RFX0UxNl9jaWxpYXRlZF9nZW5vdHlwZSRnZW5lICVpbiUgZ2VuZUxpc3QkQ2lsaW9wYXRoeSxdCmBgYAoKCmBgYHtyfQpkZl9FMTZfZXBpPC1GZXRjaERhdGEoRTE2X0RlYzd2M19lcGksYygiU3BkZWYiLCJDcmViM2wxIiwiU2NnYjNhMiIsIlNjZ2IxYTEiLCJLcnQ0IiwiS3J0MTMiLCJGb3hhMyIsIkFxcDMiLCJBcXA0IiwiQXFwNSIsIkdwMiIsIlNvc3RkYzEiLCJTbW9jMiIsIktydDE0IiwiS3J0MTUiLCJLcnQ1IiwiUmFjMiIsIkNsaWMzIiwicmVzLjEuMiIsInJlcy4xLjQiLCJnZW5vdHlwZSIsInNlcV9ncm91cCIsInNwZWNpZmljX3R5cGUiLCJjZWxsX3R5cGUiLCJEZWZiMSIsIkx5ejIiLCJMdGYiLCJTZnRwYTEiLCJTZnRwZCIsIlNmdHBiIiwiU2xwaSIsIkxjbjIiLCJQaWdyIiwiTXVjNWIiLCJNdWM1YWMiLCJNdWMxIiwiTXVjMiIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTGJwIiwiQ2QxNCIsIlRscjQiLCJUbHIyIiwiTXlkODgiLCJUaWNhbTEiLCJJdGxuMSIsIkxnYWxzMyIsIlJlZzNnIiwiTm9kMSIsIk5vZDIiLCJEZHg1OCIsIklmaWgxIiwiRGh4NTgiLCJDY2w1IiwiQ3hjbDEwIiwiQ3hjbDIiLCJDeGNsMSIsIlBmNCIsIkN4Y2wxMiIsIkN4Y2wxNCIsIkN4Y2wxNSIsIkN4Y2wxNiIsIkN4Y2wxNyIsIkNjbDIiLCJDY2w3IiwiQ2NsMTciLCJDY2wyMCIsIkNjbDIxYSIsIkNjbDI1IiwiQ2NsMjdhIiwiQ2NsMjgiLCJDeDNjbDEiLCJJbDEwIiwiVG5mIiwiUzEwMGE4IiwiUzEwMGE5IiwiSWw2IiwiSWwxOCIsIklsMWIiLCJJbDFybDEiLCJDY2wxMSIsIkNjbDI0IiwiSWwzMyIsIklsMjUiLCJUc2xwIiwiRjJybDEiLCJSZXRubGEiLCJBbG94MTUiLCJBbG94NSIsIkdhdGEyIiwiVGdmYjIiLCJUZ2ZiMSIsIk9ybWRsMyIsIlB0Z2VzIiwiUHRnZHMiLCJQdGdzMiIsIkhwZ2RzIiwiVGJ4YXMxIiwiQXJlZyIsIklmbmsiLCJJZm5scjEiLCJOZmtiaXoiLCJOZmtiaWEiKSkKCmBgYAojIyMjIyBNaWNyb2JpYWxTZW5zaW5nOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIkxicCIsIkNkMTQiLCJUbHI0IiwiVGxyMiIsIk15ZDg4IiwiVGljYW0xIiwiSXRsbjEiLCJSZWczZyIsIkxnYWxzMyIsIk5vZDEiLCJOb2QyIiwiRGR4NTgiLCJJZmloMSIsIkRoeDU4IikpCnsKcGRmKGZpbGUgPSBwYXN0ZSgiTWFudXNjcmlwdC9NaWNyb2JpYWxTZW5zaW5nX2dlbm90eXBlL0UxNi8iLGksIi5wZGYiLCBzZXAgPSAiIiksIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSkKcHJpbnQoZ2dwbG90KGRmX0UxNl9lcGksYWVzX3N0cmluZyh4PSJnZW5vdHlwZSIseT1pKSkrZmFjZXRfZ3JpZCgufmNlbGxfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKSkKZGV2Lm9mZigpCn0KYGBgCgojIyMjIyBhbnRpbWljcm9iaWFsIGVmZmVjdG9yczoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CmZvciAoaSBpbiBjKCJNdWMxIiwiTXVjNCIsIk11YzE2IiwiTXVjMjAiLCJNdWM1YiIsIk11YzVhYyIsIk11YzIiLCJEZWZiMSIsIkx5ejIiLCJMdGYiLCJTZnRwYTEiLCJTZnRwZCIsIlNmdHBiIiwiU2xwaSIsIkxjbjIiLCJQaWdyIiwiQ2hpbDQiKSkKewpwZGYoZmlsZSA9IHBhc3RlKCJNYW51c2NyaXB0L0VmZmVjdG9yc19nZW5vdHlwZS9FMTYvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9FMTZfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAojIyMjIyBjaGVtb2tpbmVzOgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9N30KZm9yIChpIGluIGMoIkNjbDUiLCJDeGNsMTAiLCJDeGNsMiIsIkN4Y2wxIiwiUGY0IiwiQ3hjbDEyIiwiQ3hjbDE0IiwiQ3hjbDE1IiwiQ3hjbDE2IiwiQ3hjbDE3IiwiQ2NsMiIsIkNjbDciLCJDY2wxNyIsIkNjbDIwIiwiQ2NsMjFhIiwiQ2NsMjUiLCJDY2wyN2EiLCJDY2wyOCIsIkN4M2NsMSIpKQp7CnBkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvY2hlbW9raW5lc19nZW5vdHlwZS9FMTYvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9FMTZfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAojIyMjIyBUaDI6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpmb3IgKGkgaW4gYygiSWwxMCIsIlRuZiIsIlMxMDBhOCIsIlMxMDBhOSIsIklsNiIsIklsMTgiLCJJbDFiIiwiSWwxcmwxIiwiQ2NsMTEiLCJDY2wyNCIsIklsMzMiLCJJbDI1IiwiVHNscCIsIkYycmwxIiwiUmV0bmxhIiwiQWxveDE1IiwiQWxveDUiLCJHYXRhMiIsIlRnZmIyIiwiVGdmYjEiLCJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIlRieGFzMSIsIkFyZWciKSkKewpwZGYoZmlsZSA9IHBhc3RlKCJNYW51c2NyaXB0L1RoMl9nZW5vdHlwZS9FMTYvIixpLCIucGRmIiwgc2VwID0gIiIpLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCnByaW50KGdncGxvdChkZl9FMTZfZXBpLGFlc19zdHJpbmcoeD0iZ2Vub3R5cGUiLHk9aSkpK2ZhY2V0X2dyaWQoLn5jZWxsX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkpCmRldi5vZmYoKQp9CmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KbGlicmFyeShnZ3B1YnIpCgpnZ3Bsb3QoZGZfRTE2X2VwaVshKGRmX0UxNl9lcGkkc3BlY2lmaWNfdHlwZT09IkRvdWJsZXQiKSxdLGFlcyhnZW5vdHlwZSxNdWMyKSkrZmFjZXRfZ3JpZCgufnNwZWNpZmljX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1nZW5vdHlwZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJ3dCIsICJtdXQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWdlbm90eXBlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsU2Z0cGIpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsU2NnYjNhMikpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KCmdncGxvdChkZl9FMTZfZXBpWyEoZGZfRTE2X2VwaSRzcGVjaWZpY190eXBlPT0iRG91YmxldCIpLF0sYWVzKGdlbm90eXBlLFNjZ2IxYTEpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhmaWxsPWdlbm90eXBlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoInd0IiwgIm11dCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9Z2Vub3R5cGUpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJHNwZWNpZmljX3R5cGU9PSJEb3VibGV0IiksXSxhZXMoZ2Vub3R5cGUsU29zdGRjMSkpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTB9CgpnZ3Bsb3QoZGZfRTE2X2VwaVshKGRmX0UxNl9lcGkkc3BlY2lmaWNfdHlwZT09IkRvdWJsZXQiKSxdLGFlcyhnZW5vdHlwZSxTbW9jMikpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQoKZ2dwbG90KGRmX0UxNl9lcGlbIShkZl9FMTZfZXBpJGNlbGxfdHlwZT09IkRvdWJsZXQiKSxdLGFlcyhnZW5vdHlwZSxOZmtiaXopKStmYWNldF9ncmlkKC5+Y2VsbF90eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9Z2Vub3R5cGUpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygid3QiLCAibXV0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1nZW5vdHlwZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKCiMjIyMjIGV4cGxvcmUgZ2VuZXMgY29ycmVsYXRlZCB3aXRoIGJhc2FsLS0+c2VjcmV0b3J5IGNoYW5nZXM6CiMjIyMjIGMzIGlzIHRoZSBiYXNhbC9zZWNyZXRvcnkgcG9wdWxhdGlvbgpgYGB7cn0KRTE2X0RlYzd2M19lcGkgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE2X0RlYzd2M19lcGksIGlkID0gInJlcy4xLjQiKQpFMTZfRGVjN3YzX2VwaV9zdWJjMzwtU3Vic2V0RGF0YShvYmplY3Q9RTE2X0RlYzd2M19lcGksaWRlbnQudXNlPWMoMykpCnRhYmxlKEUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YSRyZXMuMS40KQpgYGAKYGBge3J9CkUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YTwtRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhWywtd2hpY2gobmFtZXMoRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhKSAlaW4lIGMoInJlcy4wLjgiLCAicmVzLjEuMiIsICJyZXMuMS40IiwgInJlcy4xLjYiKSldICNyZW1vdmUgb2xkIG1ldGFkYXRhCkUxNl9EZWM3djNfZXBpX3N1YmMzIDwtIFNjYWxlRGF0YShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMykKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBGaW5kVmFyaWFibGVHZW5lcyhvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ucGxvdCA9IFRSVUUsIHgubG93LmN1dG9mZj0wLjEseC5oaWdoLmN1dG9mZiA9IEluZiwgeS5jdXRvZmYgPSAwLjUpCmBgYAoKYGBge3J9CkUxNl9EZWM3djNfZXBpX3N1YmMzIDwtIFJ1blBDQShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ucHJpbnQgPSBGQUxTRSkKUENBUGxvdChFMTZfRGVjN3YzX2VwaV9zdWJjMykKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gUHJvamVjdFBDQShvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ucHJpbnQgPSBUUlVFKQpgYGAKCmBgYHtyfQpQQ0VsYm93UGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMykKYGBgCmBgYHtyfQpuLnBjcy5zdWIzID0gMTMKYGBgCiMjIyMjcmVzb2x1dGlvbiBwYXJhbWV0ZXIgc2V0cyB0aGUg4oCYZ3JhbnVsYXJpdHnigJkgb2YgdGhlIGRvd25zdHJlYW0gY2x1c3RlcmluZywgd2l0aCBpbmNyZWFzZWQgdmFsdWVzIGxlYWRpbmcgdG8gYSBncmVhdGVyIG51bWJlciBvZiBjbHVzdGVycy4gCmBgYHtyfQpyZXMudXNlZCA8LSAxLjIKYGBgCgpgYGB7cn0KRTE2X0RlYzd2M19lcGlfc3ViYzMgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpX3N1YmMzLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViMywgCiAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgZm9yY2UucmVjYWxjID0gVCkKYGBgCmBgYHtyfQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBSdW5UU05FKG9iamVjdCA9IEUxNl9EZWM3djNfZXBpX3N1YmMzLCBkaW1zLnVzZSA9IDE6bi5wY3Muc3ViMywgcGVycGxleGl0eT0zMCkKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZG8ubGFiZWwgPSBUKQpgYGAKYGBge3J9CnJlcy51c2VkIDwtIDAuOApgYGAKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpX3N1YmMzLCBkby5sYWJlbCA9IFQpCmBgYAoKYGBge3J9CnJlcy51c2VkIDwtIDAuNgpgYGAKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IEUxNl9EZWM3djNfZXBpX3N1YmMzLCBkby5sYWJlbCA9IFQpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTMwfQpFMTZfRGVjN3YzX2VwaV9zdWJjMyA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgaWQgPSAicmVzLjAuNiIpCkRvSGVhdG1hcChvYmplY3QgPSBFMTZfRGVjN3YzX2VwaV9zdWJjMywgZ2VuZXMudXNlID0gYygiRXBjYW0iLCJLcnQ4IiwiVHJwNjMiLCJLcnQ1IiwiTWtpNjciLCJUb3AyYSIsIlNtb2MyIiwiQ2NsMjAiLCJTb3N0ZGMxIiwiQm1wNyIsIkNsaWMzIiwiQ2xkbjEwIiwiVHNwYW4zMyIsIkVoZiIsIlNmdGEyIiwiQ3JpcDIiLCJNc2xuIiwiQ3lwMnMxIiwiQ2xkbjMiLCJDbGRuNyIsIkNsZG40IiwiQVUwMjEwOTIiLCJUc3BhbjEiLCJDaGFkIiwiVHNwYW4xMyIsIktsazEwIiwiS2xrMTEiLCJLbGsxMyIsIkNlczFkIiwiS3J0NCIsIktydDEzIiwiQ3JlYjNsMSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVAogICkKYGBgCmBgYHtyfQpjb3IoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiVHJwNjMiLF0sIEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIkNyZWIzbDEiLF0pCmBgYApgYGB7cn0KY29yKEUxNl9EZWM3djNfZXBpX3N1YmMzQGRhdGFbIlRycDYzIixdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BkYXRhWyJTcGRlZiIsXSkKYGBgCmBgYHtyfQpUcnA2M19jb3I8LWFwcGx5KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGEsIDEsIGZ1bmN0aW9uKHgpIGNvcihFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJUcnA2MyIsXSx4KSkgCmBgYApgYGB7cn0KaGVhZChUcnA2M19jb3IpIApgYGAKYGBge3J9Cm1pbihUcnA2M19jb3IsbmEucm0gPSBUKSAKYGBgCmBgYHtyfQpUcnA2M19jb3Jfb3JkZXI8LW9yZGVyKFRycDYzX2NvcixkZWNyZWFzaW5nPVQpIApgYGAKYGBge3J9CmhlYWQoVHJwNjNfY29yW1RycDYzX2Nvcl9vcmRlcl0sMjApCmBgYApgYGB7cn0Kc3VtKGlzLm5hKFRycDYzX2NvcltUcnA2M19jb3Jfb3JkZXJdKSkKYGBgCmBgYHtyfQpUcnA2M19jb3JbVHJwNjNfY29yX29yZGVyXVsxNTcwNjoxNTY4Nl0KYGBgCmBgYHtyfQp0YWlsKFRycDYzX2NvcltUcnA2M19jb3Jfb3JkZXJdLDIwKQpgYGAKCgoKYGBge3J9CmNvci50ZXN0KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIlNwZGVmIixdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJUcnA2MyIsXSxtZXRob2Q9InBlYXJzb24iKQpgYGAKCmBgYHtyfQpjb3IudGVzdChFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJTcGRlZiIsXSwgRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiVHJwNjMiLF0sbWV0aG9kPSJrZW5kYWxsIikKYGBgCgpgYGB7cn0KVHJwNjNfY29yX3Rlc3Q8LWFwcGx5KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGEsIDEsIGZ1bmN0aW9uKHgpIGNvci50ZXN0KEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIlRycDYzIixdLHgsbWV0aG9kPSJwZWFyc29uIikpIApgYGAKYGBge3J9CmRmX1RycDYzX2NvclRlc3Q8LWFzLmRhdGEuZnJhbWUoZG8uY2FsbChyYmluZCwgVHJwNjNfY29yX3Rlc3QpKQoKYGBgCmBgYHtyfQpkZl9vcmRlcl9UcnA2M19jb3JUZXN0PC1kZl9UcnA2M19jb3JUZXN0W29yZGVyKHVubGlzdChkZl9UcnA2M19jb3JUZXN0JGVzdGltYXRlKSksXQpgYGAKYGBge3J9CnRpZHlfVHJwNjNfY29yPC1jYmluZChkZl9vcmRlcl9UcnA2M19jb3JUZXN0JGVzdGltYXRlLGRmX29yZGVyX1RycDYzX2NvclRlc3QkcC52YWx1ZSkKYGBgCgpgYGB7cn0KY29sbmFtZXModGlkeV9UcnA2M19jb3IpPC1jKCJjb3IiLCJwLnZhbHVlIikKYGBgCgpgYGB7cn0KaGVhZCh0aWR5X1RycDYzX2NvciwyMCkKYGBgCmBgYHtyfQp0aWR5X1RycDYzX2NvclsxNTcwNjoxNTY4NixdCmBgYApgYGB7cn0KdGFpbCh0aWR5X1RycDYzX2NvcikKYGBgCgpgYGB7cn0KS3J0OF9jb3JfdGVzdDwtYXBwbHkoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YSwgMSwgZnVuY3Rpb24oeCkgY29yLnRlc3QoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiS3J0OCIsXSx4LG1ldGhvZD0icGVhcnNvbiIpKSAKYGBgCgpgYGB7cn0KZGZfS3J0OF9jb3JUZXN0PC1hcy5kYXRhLmZyYW1lKGRvLmNhbGwocmJpbmQsIEtydDhfY29yX3Rlc3QpKQoKYGBgCmBgYHtyfQpkZl9vcmRlcl9LcnQ4X2NvclRlc3Q8LWRmX0tydDhfY29yVGVzdFtvcmRlcih1bmxpc3QoZGZfS3J0OF9jb3JUZXN0JGVzdGltYXRlKSksXQpgYGAKYGBge3J9CnN1bShpcy5uYShkZl9vcmRlcl9LcnQ4X2NvclRlc3QkZXN0aW1hdGUpKQpgYGAKCmBgYHtyfQp0aWR5X0tydDhfY29yPC1jYmluZChkZl9vcmRlcl9LcnQ4X2NvclRlc3QkZXN0aW1hdGUsZGZfb3JkZXJfS3J0OF9jb3JUZXN0JHAudmFsdWUpCmBgYAoKYGBge3J9CmNvbG5hbWVzKHRpZHlfS3J0OF9jb3IpPC1jKCJjb3IiLCJwLnZhbHVlIikKYGBgCgpgYGB7cn0KaGVhZCh0aWR5X0tydDhfY29yLDIwKQpgYGAKYGBge3J9CnRpZHlfS3J0OF9jb3JbMTU2NjY6MTU3MDYsXQpgYGAKCmBgYHtyfQpjb3IudGVzdChFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJLcnQ4IixFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCJdLCBFMTZfRGVjN3YzX2VwaV9zdWJjM0BzY2FsZS5kYXRhWyJOdW1iIixFMTZfRGVjN3YzX2VwaV9zdWJjM0BtZXRhLmRhdGEkZ2Vub3R5cGU9PSJ3dCJdLG1ldGhvZD0icGVhcnNvbiIpCmBgYApgYGB7cn0KY29yLnRlc3QoRTE2X0RlYzd2M19lcGlfc3ViYzNAc2NhbGUuZGF0YVsiS3J0OCIsRTE2X0RlYzd2M19lcGlfc3ViYzNAbWV0YS5kYXRhJGdlbm90eXBlPT0ibXV0Il0sIEUxNl9EZWM3djNfZXBpX3N1YmMzQHNjYWxlLmRhdGFbIk51bWIiLEUxNl9EZWM3djNfZXBpX3N1YmMzQG1ldGEuZGF0YSRnZW5vdHlwZT09Im11dCJdLG1ldGhvZD0icGVhcnNvbiIpCmBgYAoKCgoKCgoKCgoKCgoKCgoK